package appStarshipPushups.common;

import java.awt.Point;
import java.util.LinkedList;

/**
 * Cette classe contient principalement toutes les constantes nécessaires aux 
 * deux projets et fortement ou étroitement reliées au protocole.
 * @author Adam Labranche & Kevin Arsenault
 *
 */
public abstract class Protocole 
{
	public static final String SEPARATOR = "|";
	public static final String SEPARATOR_SPLIT = "\\|";
	// Constantes contenant les fonctions du protocole(Sortie client).
	public static final String FUNCTION_JOIN = "join";
	public static final String FUNCTION_MOVE = "move";
	public static final String FUNCTION_SHOOT_ON = "shooton";
	public static final String FUNCTION_SHOOT_OFF = "shootoff";
	public static final String FUNCTION_QUIT = "quit";

	// Constante servant à l'utilisation du clavier.
	public static final String LEFT = "left";
	public static final String DOWN = "down";
	public static final String RIGHT = "right";
	public static final String UP = "up";
	
	public static final String USER_NAME = "lana";
	public static final String PASSWORD = "steve";
	
	public static final int FUNCTION_INDEX = 0;
	
	public static final int JOIN_USER_NAME = 1;
	public static final int JOIN_PASSWORD = 2;
	
	public static final int LISTENING_PORT = 4444;
	
	// Constantes contenant les fonctions du protocole(Sortie serveur).
	// Constantes de la fonction qui modifie les coordonnées d'un joueur.
	public static final String FUNCTION_SET_PLAYER = "setplayer";
	public static final int SET_PLAYER_LENGTH = 5;
	public static final int SET_PLAYER_INDEX = 1;
	public static final int SET_PLAYER_X = 2;
	public static final int SET_PLAYER_Y = 3;
	public static final int SET_PLAYER_DIRECTION = 4;
		
	// Constantes de la fonction qui ajoute un laser.
	public static final String FUNCTION_ADD_LASER = "addlaser";
	public static final int ADD_LASER_LENGTH = 6;
	public static final int ADD_LASER_ID = 1;
	public static final int ADD_LASER_STARTX = 2;
	public static final int ADD_LASER_STARTY = 3;
	public static final int ADD_LASER_ENDX = 4;
	public static final int ADD_LASER_ENDY = 5;
	
	// Constantes de la fonction qui enlève un laser.
	public static final String FUNCTION_REMOVE_LASER = "removelaser";
	public static final int REMOVE_LASER_LENGTH = 2;
	public static final int REMOVE_LASER_ID = 1;
	
	// Constantes de la fonction qui enlève un joueur.
	public static final String FUNCTION_ERASE_PLAYER = "eraseplayer";
	public static final int ERASE_PLAYER_LENGTH = 2;
	public static final int ERASE_PLAYER_INDEX = 1;
	
	// Les vaisseaux ainsi que les laser du jeu.
	private static LinkedList< Starship > ships = new LinkedList< Starship >();
	private static LinkedList< Laser > lasers = new LinkedList< Laser >();
	
	// La taille de l'écran.
	public static final int SCREEN_SIZE_HEIGHT = 480;
	public static final int SCREEN_SIZE_WIDTH = 640;
	
	private static Emplacement screenEmplacement = new Emplacement(new Point(0,0), new Point(SCREEN_SIZE_WIDTH, SCREEN_SIZE_HEIGHT));
	
	// Les dégats du laser.
	public static final int LASER_DMG = -5;
	
	// Constantes de la fonction qui envoye une erreur au joueur.
	public static final String FUNCTION_SEND_ERROR = "senderror";
	public static final int SEND_ERROR_LENGTH = 2;
	public static final int SEND_ERROR_MSG_INDEX = 1;
	
	// Constante de la fonction qui accèpte un joueur.
	public static final String FUNCTION_ACCEPT_PLAYER = "acceptplayer";
	public static final int ACCEPT_PLAYER_LENGTH = 2;
	public static final int ACCEPT_PLAYER_ID = 1;
	
	// Constante de la fonction qui averti le joueur qu'il n'est plus de la 
	// partie.
	public static final String FUNCTION_LEAVEOK = "leaveok";
	
	// Variable pour la synchronisation.
	public static Object synchronization = new Object();
	
	// Variable de la vitesse du vaisseau.
	public static final int SHIP_SPEED = 5;
	
	/**
	 * Prendre les vaisseaux du jeu.
	 * @return Les vaisseaux du jeu.
	 */
	public static LinkedList< Starship > getShips()
	{
		return Protocole.ships;
	}
	
	/**
	 * Prendre les lasers du jeu.
	 * @return Les lasers du jeu.
	 */
	public static LinkedList< Laser > getLasers()
	{
		return Protocole.lasers;
	}
	
	/**
	 * Indique la taille de l'écran à des buts utilitaires de collision.
	 * @return La taiile de l'écran.
	 */
	public static Emplacement getScreenEmplacement()
	{
		return Protocole.screenEmplacement;
	}
	
}
